home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / Goodies / CallBack / SOURCE / BASEDISP.CPP next >
Encoding:
C/C++ Source or Header  |  1995-10-03  |  4.5 KB  |  225 lines

  1. /*
  2. *   Visual Basic Callback Server Source
  3. *
  4. *   (c) Copyright Microsoft Corp. 1995 All Rights Reserved
  5. */ 
  6.  
  7. #include "hostenv.h"
  8. #include "svrmain.h"
  9. #include "BaseDisp.h"
  10. #include "CBackODL.h"
  11.  
  12. /*Support function for deriving*/
  13. void CBaseIDispatch::Derive(CBaseIDispatch FAR* pDest, CBaseIDispatch FAR* pSource)
  14. {
  15.     if (pSource)
  16.         {
  17.         CBaseIDispatch &refDest = *pDest;
  18.         CBaseIDispatch &refSrc = *pSource;
  19.         if (refSrc.m_pSupportErrorInfo)
  20.             {
  21.             refDest.m_pSupportErrorInfo = refSrc.m_pSupportErrorInfo;
  22.             refDest.m_pSupportErrorInfo->AddRef();
  23.             }
  24.         }
  25. }
  26. /*CBaseIDispatch: base implementation to support IDispatch*/
  27. CBaseIDispatch::CBaseIDispatch()
  28. {
  29.     m_refs = 0;
  30.     m_pIID = &IID_NULL;
  31.     m_ptinfo = NULL;
  32.     m_pSupportErrorInfo = NULL; 
  33.     g_cObj++;
  34. }
  35. CBaseIDispatch::~CBaseIDispatch()
  36. {
  37.     if (m_ptinfo)
  38.         m_ptinfo->Release();
  39.     if (m_pSupportErrorInfo)
  40.         m_pSupportErrorInfo->Release();
  41.     g_cObj--;
  42. }
  43. STDMETHODIMP
  44. CBaseIDispatch::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
  45. {
  46.     if (IIDOK(IUnknown) || IIDOK(IDispatch) || IsEqualIID(riid, *m_pIID))
  47.         {
  48.         *ppvObj = this;
  49.         }
  50.     else if (m_pSupportErrorInfo && IIDOK(ISupportErrorInfo))
  51.         {
  52.         return m_pSupportErrorInfo->QueryInterface(riid, ppvObj);
  53.         }
  54.     else if (IIDOK(IProvideClassInfo))
  55.         {
  56.         HRESULT hr;
  57.         if SUCCEEDED(hr = LoadTypeInfo())
  58.             return CProvideClassInfo::Create(m_ptinfo, (CProvideClassInfo FAR* FAR*) ppvObj);
  59.         else
  60.             return hr;
  61.         }
  62.     else
  63.         {
  64.         *ppvObj = NULL;
  65.         return ResultFromScode(E_NOINTERFACE);
  66.         }
  67.     AddRef();
  68.     return NOERROR;
  69. }
  70. STDMETHODIMP_(ULONG)
  71. CBaseIDispatch::AddRef(void)
  72. {
  73.     return ++m_refs;
  74. }
  75. STDMETHODIMP_(ULONG)
  76. CBaseIDispatch::Release(void)
  77. {
  78.     if(--m_refs == 0)
  79.         {
  80.         delete this;                                
  81.         return 0;
  82.         }
  83.     return m_refs;
  84. }
  85. /* IDispatch methods */
  86. STDMETHODIMP
  87. CBaseIDispatch::GetTypeInfoCount(UINT FAR* pctinfo)
  88. {
  89.     *pctinfo = 1;
  90.     return NOERROR;
  91. }
  92.  
  93. STDMETHODIMP
  94. CBaseIDispatch::GetTypeInfo(
  95.   UINT itinfo, 
  96.   LCID lcid,
  97.   ITypeInfo FAR* FAR* pptinfo)
  98. {
  99.  
  100.     HRESULT hr;
  101.     if SUCCEEDED( hr = LoadTypeInfo() )
  102.         {
  103.         m_ptinfo->AddRef();
  104.         *pptinfo = m_ptinfo;
  105.         }
  106.     else
  107.         *pptinfo = NULL;
  108.  
  109.     return hr;
  110. }
  111.  
  112. STDMETHODIMP
  113. CBaseIDispatch::GetIDsOfNames(
  114.   REFIID riid, 
  115.   OLECHAR FAR* FAR* rgszNames, 
  116.   UINT cNames, 
  117.   LCID lcid, 
  118.   DISPID FAR* rgdispid)
  119. {
  120.     HRESULT hr;
  121.     if (riid != IID_NULL)
  122.         hr = ResultFromScode(DISP_E_UNKNOWNINTERFACE);
  123.     else if SUCCEEDED( hr = LoadTypeInfo() )
  124.         hr = DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
  125.     return hr;
  126. }
  127. STDMETHODIMP
  128. CBaseIDispatch::Invoke(
  129.   DISPID dispidMember, 
  130.   REFIID riid, 
  131.   LCID lcid, 
  132.   WORD wFlags, 
  133.   DISPPARAMS FAR* pdispparams, 
  134.   VARIANT FAR* pvarResult, 
  135.   EXCEPINFO FAR* pexcepinfo, 
  136.   UINT FAR* puArgErr)
  137. {
  138.     HRESULT hr;
  139.     if (riid != IID_NULL)
  140.         hr = ResultFromScode(DISP_E_UNKNOWNINTERFACE);
  141.     else if SUCCEEDED( hr = LoadTypeInfo() )
  142.         hr = DispInvoke(this, m_ptinfo, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
  143.     return hr;        
  144. }
  145.  
  146. HRESULT CBaseIDispatch::LoadTypeInfo()
  147. {
  148.     HRESULT hr;
  149.     if (m_ptinfo)
  150.         hr = NOERROR;
  151.     else
  152.         hr = LoadResourceTypeLib(LIBID_VBCallBack, *m_pIID, &m_ptinfo);
  153.     return hr;
  154. }
  155.  
  156. /*CProvideClassInfo implementation*/
  157. HRESULT CProvideClassInfo::Create(ITypeInfo FAR* ptinfo, CProvideClassInfo FAR* FAR* retVal)
  158. {
  159.     if (NULL == (*retVal = new CProvideClassInfo()))
  160.         return ResultFromScode(E_OUTOFMEMORY);
  161.     else
  162.         {
  163.         (*retVal)->m_ptinfo = ptinfo;
  164.         ptinfo->AddRef();
  165.         (*retVal)->AddRef();
  166.         return NOERROR;
  167.         }
  168. }
  169. CProvideClassInfo::CProvideClassInfo()
  170. {
  171.     m_refs = 0;
  172.     g_cObj++;
  173. }
  174. CProvideClassInfo::~CProvideClassInfo()
  175. {
  176.     if (m_ptinfo)
  177.         m_ptinfo->Release();
  178.     g_cObj--;
  179. }
  180. STDMETHODIMP
  181. CProvideClassInfo::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
  182. {
  183.     if (IIDOK(IProvideClassInfo) || IIDOK(IUnknown))
  184.         {
  185.         *ppvObj = this;
  186.         }
  187.     else
  188.         {
  189.         *ppvObj = NULL;
  190.         return ResultFromScode(E_NOINTERFACE);
  191.         }
  192.     AddRef();
  193.     return NOERROR;
  194. }
  195. STDMETHODIMP_(ULONG)
  196. CProvideClassInfo::AddRef(void)
  197. {
  198.     return ++m_refs;
  199. }
  200. STDMETHODIMP_(ULONG)
  201. CProvideClassInfo::Release(void)
  202. {
  203.     if(--m_refs == 0)
  204.         {
  205.         delete this;                                
  206.         return 0;
  207.         }
  208.     return m_refs;
  209. }
  210. STDMETHODIMP
  211. CProvideClassInfo::GetClassInfo(THIS_ LPTYPEINFO FAR* ppTI)
  212. {
  213.     if (m_ptinfo)
  214.         {
  215.         m_ptinfo->AddRef();
  216.         *ppTI = m_ptinfo;
  217.         return NOERROR;
  218.         }
  219.     else
  220.         {
  221.         *ppTI = NULL;
  222.         return ResultFromScode(E_FAIL);
  223.         }
  224. }
  225.